using System;
using System.Data;

namespace SharpObjects.Data
{

	public class DbCommandParamAccessor
	{
        protected IDb m_db;
		protected IDataParameterCollection m_params;

		public DbCommandParamAccessor(IDb db, IDataParameterCollection parameters)
		{
            m_db = db;
			m_params = parameters;
		}

		public IDataParameterCollection Parameters { get { return m_params; } }

		public bool? GetBoolean(string sParamName)
		{
			IDataParameter param = GetParam(sParamName);

			if (param.Value == null || param.Value == DBNull.Value)
			{
                return null;
			}

			return Convert.ToBoolean(param.Value);
		}
 
		public bool GetBoolean(string sParamName, bool DefaultValue)
		{
			IDataParameter param = GetParam(sParamName);

			if (param.Value == null || param.Value == DBNull.Value)
			{
                return DefaultValue;
			}

			return Convert.ToBoolean(param.Value);
		}
 
		public DateTime? GetDateTime(string sParamName)
		{
			IDataParameter param = GetParam(sParamName);

			if (param.Value == null || param.Value == DBNull.Value)
			{
                return null;
			}

			return Convert.ToDateTime(param.Value);
		}
 
		public DateTime GetDateTime(string sParamName, DateTime DefaultValue)
		{
			IDataParameter param = GetParam(sParamName);

			if (param.Value == null || param.Value == DBNull.Value)
			{
                return DefaultValue;
			}

			return Convert.ToDateTime(param.Value);
		}
 
		public double? GetDouble(string sParamName)
		{
			IDataParameter param = GetParam(sParamName);

			if (param.Value == null || param.Value == DBNull.Value)
			{
                return null;
			}

			return Convert.ToDouble(param.Value);
		}
 
		public double GetDouble(string sParamName, double DefaultValue)
		{
			IDataParameter param = GetParam(sParamName);

			if (param.Value == null || param.Value == DBNull.Value)
			{
				return DefaultValue;
			}

			return Convert.ToDouble(param.Value);
		}
 
		public int? GetInteger(string sParamName)
		{
			IDataParameter param = GetParam(sParamName);

			if (param.Value == null || param.Value == DBNull.Value)
			{
                return null;
			}

			return Convert.ToInt32(param.Value);
		}
 
		public int GetInteger(string sParamName, int DefaultValue)
		{
			IDataParameter param = GetParam(sParamName);

			if (param.Value == null || param.Value == DBNull.Value)
			{
				return DefaultValue;
			}

			return Convert.ToInt32(param.Value);
		}
 
		public string GetString(string sParamName)
		{
			IDataParameter param = GetParam(sParamName);

			if (param.Value == null || param.Value == DBNull.Value)
			{
                return null;
			}

			return param.Value.ToString();
		}
 
		public string GetString(string sParamName, string DefaultValue)
		{
			IDataParameter param = GetParam(sParamName);

			if (param.Value == null || param.Value == DBNull.Value)
			{
				return DefaultValue;
			}

			return param.Value.ToString();
		}

		protected IDataParameter GetParam(string sParamName)
		{
            if (!sParamName.StartsWith(m_db.ParameterPrefix))
            {
                sParamName = m_db.ParameterPrefix + sParamName;
            }

			IDataParameter param = m_params[sParamName] as IDataParameter;
			return param;
		}
 

	}
}
